/**
 * 服务管理器 - 整合后端和前端服务的管理
 */

const backendService = require('./backend');
const frontendService = require('./frontend');
const logger = require('../utils/logger');

/**
 * 启动指定服务或所有服务
 * @param {string|null} service - 要启动的服务名称 ('backend', 'frontend' 或 null表示全部)
 * @param {Object} config - 服务配置
 * @returns {Promise<boolean>} 是否全部启动成功
 */
exports.startServices = async (service, config) => {
  logger.info(`开始启动服务${service ? `: ${service}` : ''}`);
  
  let success = true;
  
  // 根据服务类型启动
  if (!service || service === 'backend') {
    // 启动后端服务
    logger.info('========== 启动后端服务 ==========');
    const backendSuccess = await backendService.startBackend(config);
    if (!backendSuccess) {
      success = false;
      if (!service) {
        logger.warn('后端服务启动失败，但将继续尝试启动前端服务');
      }
    } else if (!service) {
      // 如果要启动所有服务且后端启动成功，等待一段时间
      logger.info(`等待 ${config.general.waitBetweenServices / 1000} 秒后启动前端服务...`);
      await new Promise(resolve => setTimeout(resolve, config.general.waitBetweenServices));
    }
  }
  
  if (!success && service) {
    // 如果指定服务启动失败，直接返回
    return false;
  }
  
  if (!service || service === 'frontend') {
    // 启动前端服务
    logger.info('========== 启动前端服务 ==========');
    const frontendSuccess = await frontendService.startFrontend(config);
    if (!frontendSuccess) {
      success = false;
    }
  }
  
  if (success) {
    logger.info('\n✅ 所有服务启动成功!');
    // 显示服务访问地址
    const frontendPort = frontendService.getFrontendPort();
    logger.info(`后端服务地址: http://localhost:${config.backend.port}`);
    if (frontendPort) {
      logger.info(`前端服务地址: http://localhost:${frontendPort}`);
    }
    logger.info('\n提示: 使用 Ctrl+C 停止服务');
  } else {
    logger.error('\n❌ 部分服务启动失败，请检查日志信息');
  }
  
  return success;
};

/**
 * 停止指定服务或所有服务
 * @param {string|null} service - 要停止的服务名称 ('backend', 'frontend' 或 null表示全部)
 * @returns {Promise<boolean>} 是否全部停止成功
 */
exports.stopServices = async (service) => {
  logger.info(`开始停止服务${service ? `: ${service}` : ''}`);
  
  let success = true;
  
  // 停止顺序：先停止前端，再停止后端
  if (!service || service === 'frontend') {
    logger.info('========== 停止前端服务 ==========');
    const frontendSuccess = await frontendService.stopFrontend();
    success = success && frontendSuccess;
  }
  
  if (!service || service === 'backend') {
    logger.info('========== 停止后端服务 ==========');
    const backendSuccess = await backendService.stopBackend();
    success = success && backendSuccess;
  }
  
  if (success) {
    logger.info('\n✅ 所有服务停止成功!');
  } else {
    logger.error('\n⚠️ 部分服务停止过程中出现问题');
  }
  
  return success;
};

/**
 * 检查所有服务的状态
 * @returns {Promise<Object>} 服务状态对象
 */
exports.checkServices = async () => {
  // 这里需要一个临时配置来检查状态
  // 实际应用中，应该从配置文件加载
  const tempConfig = {
    backend: {
      port: 8081,
      healthCheckPath: '/actuator/health'
    },
    frontend: {
      healthCheckPath: '/'
    }
  };
  
  const status = {
    backend: await backendService.checkBackendStatus(tempConfig),
    frontend: await frontendService.checkFrontendStatus(tempConfig)
  };
  
  return status;
};

/**
 * 获取服务信息
 * @returns {Object} 服务信息对象
 */
exports.getServiceInfo = () => {
  return {
    frontendPort: frontendService.getFrontendPort()
  };
};

// 注册进程终止处理，确保在工具退出时停止所有服务
process.on('SIGINT', async () => {
  logger.info('\n接收到中断信号，正在停止所有服务...');
  await exports.stopServices();
  process.exit(0);
});

process.on('SIGTERM', async () => {
  logger.info('\n接收到终止信号，正在停止所有服务...');
  await exports.stopServices();
  process.exit(0);
});